#include "ModuleBoxes.h"

void ModuleBoxes::init(QCVModuleHandlerInterface * parent)
{
	this->parent=parent;
	win=new QWidget();
  layout=new QVBoxLayout(win);
	sb_marges=new QSpinBox(win);
	sb_marges->setPrefix("marges=");
	sb_marges->setRange(0,100);	
	layout->addWidget(sb_marges);

	sb_threshold=new QSpinBox(win);
	sb_threshold->setPrefix("seuil=");
	sb_threshold->setRange(0,100);	
	layout->addWidget(sb_threshold);
}
////////////////////////////////////////////////////////////////////////////////
void ModuleBoxes::free()
{
	delete win;
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat & ModuleBoxes::process()
{
	//on compare les boxes par rapport a leur distances
	for(int i=0;i<boxes.rows;i++)
	{
		
		float dist=10000000000; 		
		for(int j=0;j<previous_boxes.rows;j++)
		{
			float d=sqrt((boxes(i,0)-previous_boxes(j,0))*(boxes(i,0)-previous_boxes(j,0))+
									 (boxes(i,1)-previous_boxes(j,1))*(boxes(i,1)-previous_boxes(j,1)));
									 //(boxes(i,2)-previous_boxes(j,2))*(boxes(i,2)-previous_boxes(j,2))+
									 //(boxes(i,3)-previous_boxes(j,3))*(boxes(i,3)-previous_boxes(j,3)));
			if(d<dist && d<sb_threshold->value())
			{
				d=dist;
				boxes(i,4)=previous_boxes(j,4);
			}
		}	
	}
		
	previous_boxes=boxes.clone();
	return boxes;
}
////////////////////////////////////////////////////////////////////////////////
void ModuleBoxes::setInput(int n,const cv::Mat & m)
{
	if(n==0 && m.rows>0 && m.cols>=6)
	{	
		cv::Mat_<float> currentKeys;
		currentKeys=m.clone();		

		//on simplifie les labels et on compte combien il y en a 
		std::vector<int> labels;
		labels.clear();
		
		
		for(int i=0;i<currentKeys.rows;i++)
		{
			bool exist=false;
			int j=0;			
			
			for(j=0;j<(int)labels.size();j++)
			{
				if(labels[j]==currentKeys(i,6)){exist=true;break;}
			}	

			if(exist==false)
			{
				labels.push_back(currentKeys(i,6));				
			}
			currentKeys(i,6)=j;
		}

		//on en deduit le nombre de boites englobantes
		boxes.create(labels.size(),5);
		boxes.col(0).setTo(100000);
		boxes.col(1).setTo(100000);
		boxes.col(2).setTo(0);
		boxes.col(3).setTo(0);
		
		boxes.col(4).setTo(0);

		for(unsigned int i=0;i<currentKeys.rows;i++)		
		{
			if(boxes(currentKeys(i,6),0)>currentKeys(i,0)-sb_marges->value())boxes(currentKeys(i,6),0)=currentKeys(i,0)-sb_marges->value();
			if(boxes(currentKeys(i,6),1)>currentKeys(i,1)-sb_marges->value())boxes(currentKeys(i,6),1)=currentKeys(i,1)-sb_marges->value();
			if(boxes(currentKeys(i,6),2)<currentKeys(i,0)+sb_marges->value())boxes(currentKeys(i,6),2)=currentKeys(i,0)+sb_marges->value();
			if(boxes(currentKeys(i,6),3)<currentKeys(i,1)+sb_marges->value())boxes(currentKeys(i,6),3)=currentKeys(i,1)+sb_marges->value();

			boxes(currentKeys(i,6),4)=currentKeys(i,6);
		}

	}
	else
	{
		boxes.release();
	}
}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModuleBoxes::widget()
{
	return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleBoxes::getName()
{
	return tr("Get Boxes");
}
////////////////////////////////////////////////////////////////////////////////
int ModuleBoxes::nbInputs()
{
	return 1;
}
////////////////////////////////////////////////////////////////////////////////
bool ModuleBoxes::setParams(QString params)
{
	QStringList list_params=params.split(";");
		
	if(list_params.size()==2)
	{
		sb_marges->setValue(list_params[0].toInt());
		sb_threshold->setValue(list_params[1].toInt());

		return true;
	}
	else
	{
		return false;
	}	
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleBoxes::getParams()
{
	return QString::number(sb_marges->value())+tr(";")+
				 QString::number(sb_threshold->value());
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleBoxes::help(int id)
{
	if(id==-2)
	{
		return tr("Permet de d'obtenir des boites englobantes à partir de points clefs labelisés");
	}
	else if(id==-1)
	{
		return tr("boxes");
	}
	else if(id==0)
	{
		return tr("keyspoints");
	}
	else 
	{
		return tr("Erreur");
	}
}
////////////////////////////////////////////////////////////////////////////////
Q_EXPORT_PLUGIN2(ModuleBoxes_plugin,ModuleBoxes);  
